{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "668b921e-8ca3-4aff-bb04-0b1ef2abb6f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "import torch\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "aab43211-4162-4040-ab54-f32cd5fc6ade",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 简单线性模型 y = wx + b\n",
    "# 定义超参数\n",
    "learning_rate = 0.01\n",
    "num_epochs = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "665300aa-4b25-4a77-8078-19134747b039",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 随机生成训练数据\n",
    "X = torch.randn(100, 1)\n",
    "y = 2 * X + 3 + torch.randn(100, 1)\n",
    "\n",
    "# 初始化参数\n",
    "w = torch.zeros(1, requires_grad=True)\n",
    "b = torch.zeros(1, requires_grad=True)\n",
    "\n",
    "# 创建AdaGrad optimizer\n",
    "optimizer = torch.optim.Adagrad([w, b], lr=learning_rate)\n",
    "\n",
    "# loss\n",
    "losses = []"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "47d672ab-c762-4b6c-bf84-b6f56585154b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 训练模型\n",
    "for epoch in range(num_epochs):\n",
    "    y_pred = w * X + b\n",
    "\n",
    "    loss = torch.mean((y_pred - y) ** 2)\n",
    "\n",
    "    losses.append(loss.item())\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "\n",
    "plt.plot(losses)\n",
    "plt.xlabel('Epoch')\n",
    "plt.ylabel('Loss')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "21fbcb37-ca17-4afa-a6c8-ca02a01594cb",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.21"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
